TEST-后台获取其他网站的HTML

<?php
 header("Content-type: text/html; charset=utf-8");//不要动

 $UrlFirst = 'http://www.cdsafety.org.cn/index.php?r=news%2Fdetail&id=';//URL前缀

 $idList = $arrayName = array(
   '1680'
 );//文章id列表，把需要截取的文章的id都填到这

 $Tag='div';//你需要获取的 HTML标签名
 $Tag_id ='id="details_content"';  //在这个标签有什么属性 id class name ,区分单双引号

 $Html = array();//初始化素组，不要动
foreach ($idList as $key => $value) {
  $html = getWebTag($Tag_id, $UrlFirst.$value, $Tag, false, false);//临时存储获取的HTML
  array_push($Html,$html);//添加到数组
}

//打印结果
print_r($Html);


/**下面的代码不要动
*/
     function getWebTag($tag_id,$url=false,$tag='div',$data=false,$first=false){
	          //默认采用URL获取数据
         if($url !== false){
             $data = file_get_contents( $url );
         }
         //页面编码判定及转码
         $charset_pos = stripos($data,'charset');
         if($charset_pos) {
             if(stripos($data,'charset=utf-8',$charset_pos)) {
                 $data = iconv('utf-8','utf-8',$data);
             }else if(stripos($data,'charset=gb2312',$charset_pos)) {
                 $data = iconv('gb2312','utf-8',$data);
             }else if(stripos($data,'charset=gbk',$charset_pos)) {
                 $data = iconv('gbk','utf-8',$data);
             }
         }

         //匹配命中标签至数组$hits
         preg_match_all('/<'.$tag.'[^<]*?'.$tag_id.'/i',$data,$hits,PREG_OFFSET_CAPTURE);
         if(count($hits[0]) === 0) {                //未命中，直接返回
             return '没有匹配项！';
         }

         preg_match_all('/<'.$tag.'/i',$data,$pre_matches,PREG_OFFSET_CAPTURE);        //获取所有HTML标签前缀
         preg_match_all('/<\/'.$tag.'/i',$data,$suf_matches,PREG_OFFSET_CAPTURE);     //获取所有HTML标签后缀

         //判断是否<div></div>格式，是则添加结束标签，否则为false;  注：img、input等可能不是这种格式，此时$suf_matches[0]为空。
         if(!empty($suf_matches[0])) $endTag = '</'.$tag.'>';
         else $endTag = false;

         //合并所有HTML标签
         $htmltags = array();
         if($endTag !== false){
             foreach($pre_matches[0] as $index=>$pre_div){
                 $htmltags[(int)$pre_matches[0][$index][1]] = 'p';
                 $htmltags[(int)$suf_matches[0][$index][1]] = 's';
             }
         }else{
             foreach($pre_matches[0] as $index=>$pre_div){
                 //非<div></div>格式，获取前缀下标后的第一个>作为标签结束
                 $suf_matches[0][$index][1] = stripos($data,'>',$pre_matches[0][$index][1])+1;

                 $htmltags[(int)$pre_matches[0][$index][1]] = 'p';
                 $htmltags[(int)$suf_matches[0][$index][1]] = 's';
             }
         }
         //对所有HTML标签按index进行排序
         $sort = array_keys($htmltags);
         asort($sort);

         //开始获取命中字符串
         $hitTagStrings = array();
         foreach($hits[0] as $hit){
             $hit = $hit[1];        //获取命中index

             $count = count($sort);    //循环控制，$count--避免无限循环
             foreach($pre_matches[0] as $index=>$pre_div){
                 //最后一个$pre_matches[0][$index+1]会造成数组出界，因此设置其index等于总长度
                 if(!isset($pre_matches[0][$index+1][1])) $pre_matches[0][$index+1][1] = strlen($data);

                 //<div $hit <div+1    时div被命中
                 if(($pre_matches[0][$index][1] <= $hit) && ($hit < $pre_matches[0][$index+1][1])){
                     $deeper = 0;
                     //弹出被命中HTML标签前的所有HTML标签
                     while(array_shift($sort) != $pre_matches[0][$index][1] && ($count--)) continue;
                     //对剩余HTML标签进行匹配，若下一个为前缀(p)，则向下一层，$deeper加1，
                     //否则后退一层，$deeper减1，$deeper为0则命中匹配结束标记，计算div长度
                     foreach($sort as $key){
                         if($htmltags[$key] == 'p') {    //进入子层
                             $deeper++;
                         }else if($deeper == 0) {        //碰到结束标记
                             $length = $key-$pre_matches[0][$index][1];        //长度等于结束标记index 减去 前缀index
                             break;
                         }else {                            //碰到子层结束标记
                             $deeper--;
                         }
                     }
                     $hitTagStrings[] = substr($data,$pre_matches[0][$index][1],$length).$endTag;
                     break;
                 }
             }
             //若只获取第一个匹配项，退出循环
             if($first && count($hitTagStrings) == 1) break;
         }

         return $hitTagStrings;
     }
?>
